#include "admin.h"
#include "../bd/bd.h"
#include "../util/util.h"
#include <string.h>
#include <stdlib.h>
#include <stdio.h>

extern nodo_usuario * vendActual;
static int POS;

static int menuLis1(nodo_producto * dato,int pos);
static int menuLis2(nodo_usuario * dato, int pos);
static void ordProd(void);
static void adminProd(void);
static void ord1(void), ord2(void), ord3(void), ord4(void);
static int addProd(void * asdf);
static int delProd(void * lprod);
static int editProd(void * edit);
static int addUsr(void * lala);
static int delUsr(void * borrar);
static int editUsr(void * usuario);
static void adminUsuarios(void);
static void mostrarStatsP(void);
static void mostrarStatsU(void);
static void masmesac(void);
static void masTotal(void);
void masmesant2(void);
void masmesant(void);
void masSemana(void);
void masDia(void);
#ifdef __linux__
static void itoa(int num,char * str, int base);
#endif

/*
    Menus del administrador

*/

menu menuAdmin[] =
{
    {"Administrar productos", adminProd, "Ver la lista de productos, agregar, quitar y editarlos",0 },
    {"Administrar usuarios",adminUsuarios,"Agregar, editar, eliminar usuarios",0},
    {"Ordenar productos",ordProd,"Ordena productos por precio",0},
    {"Estadisticas productos",mostrarStatsP,"Muestra estadisticas de ventas de productos",0},
    {"Estadisticas usuarios",mostrarStatsU,"Muestra estadisticas de ventas por usuarios",0},
    { "",0, "",3 }
};

void admin(void)
{
    mostrar_menu(menuAdmin);
}

/* Menu ordenar productos */
void ordProd(void)
{
    menu ordenar[]=
    {
        {"Por nombre",ord1, "Ordenar por nombre",0},
//        {"Por descripcion",ord2, "Ordenar por descripcion",0},
        {"Por codigo",ord2, "Ordenar por codigo",0},
        {"Por precio",ord3, "Ordenar por precio",0},
        {"Por stock",ord4, "Ordenar por stock",0},
        {"",NULL, "",8}
    };
    mostrar_menu(ordenar);
}

/* criterios de ordenamiento */
void ord1(void)
{
    if((preg_error("Presione A para A-Z o Z para Z-A\n Cualquier otra tecla es A-Z",0)==('Z'|'z')))
        ordenarListaP(NULL,compProdNomZA,0);
    else ordenarListaP(NULL,compProdNomAZ,0);
}

void ord2(void)
{
    if((preg_error("Presione A para A-Z o Z para Z-A\n Cualquier otra tecla es A-Z",0)==('Z'|'z')))
        ordenarListaP(NULL,compProdCodZA,0);
    else ordenarListaP(NULL,compProdCodAZ,0);
}

void ord3(void)
{
    if((preg_error("Presione A para ascendente o Z para descendiente\n Cualquier otra tecla es ascendente",0)==('Z'|'z')))
        ordenarListaP(NULL,compProdPrecioDes,0);
    else ordenarListaP(NULL,compProdPrecioAs,0);
}

void ord4(void)
{
    if((preg_error("Presione A para ascendente o Z para descendiente\n Cualquier otra tecla es ascendente",0)==('Z'|'z')))
        ordenarListaP(NULL,compProdStockDes,0);
    else ordenarListaP(NULL,compProdStockAs,0);
}

int ord12(void * dato)
{
    dato=NULL;
    ord1();
    return 3;
}

int ord22(void * dato)
{
    dato=NULL;
    ord2();
    return 3;
}

int ord32(void * dato)
{
    dato=NULL;
    ord3();
    return 3;
}

int ord42(void * dato)
{
    dato=NULL;
    ord4();
    return 3;
}

// menu para la lista de productos
int menuLis1(nodo_producto * dato, int pos)
{
    menuL opcsLista[]=
    {
        {"Agregar producto",addProd, "Agregar un producto a la base de datos",0},
        {"Editar producto",editProd, "Editar el producto seleccionado",0},
        {"Borrar producto",delProd, "Borra el producto seleccionado",0},
        {"",NULL, "",8}
    };
    return menuLista(opcsLista,pos,(void **)dato);
}

//menu para la lista de usuarios
int menuLis2(nodo_usuario * dato, int pos)
{
    menuL adminU[]=
    {
        {"Agregar usuario",addUsr, "Agregar un usuario administrador o vendedor",0},
        {"Eliminar usuario",delUsr, "Eliminar un usuario administrador o vendedor",0},
        {"Editar usuario",editUsr,"Cambia la informacion actual de un usuario",0},
        {"",NULL, "",8}
    };
    return menuLista(adminU,pos,(void *)dato);
}

void adminUsuarios(void)
{
    nodo_producto * prod;
    nodo_usuario * usri;
    inicializarBd(&usri,&prod);
    mostrarListaU(usri,menuLis2);
}

int addProd(void * asdf)
{
    asdf=NULL;
    FECHA * fecha=obtenerFecha();
    char **resp;
    int ret=-1;
    res_busq_p * temp;
    nodo_producto * nuevo=(nodo_producto *) malloc(sizeof(nodo_producto));
    char *preg[]=
    {
        "Nombre","Descripcion","Codigo","Precio venta","Precio compra","Stock",NULL
    };
    if((resp=obtener_datos(preg,"Ingrese datos producto",MAXPROD,0))&&resp[0]!='\0')
    {
        nuevo->nombre=resp[0];
        nuevo->descripcion=resp[1];
        nuevo->codigo=resp[2];
        nuevo->precio=atoi(resp[3]);
        nuevo->compra=atoi(resp[4]);
        nuevo->stock=atoi(resp[5]);
        nuevo->dia.t=fecha->dia;
        nuevo->dia.dato=0;
        nuevo->semana.t=fecha->semana;
        nuevo->semana.dato=0;
        nuevo->mes_act.t=fecha->mes;
        nuevo->mes_act.dato=0;
        nuevo->mes_ant.t=fecha->mes-1;
        nuevo->mes_ant.dato=0;
        nuevo->mes_ant2.t=fecha->mes-2;
        nuevo->mes_ant2.dato=0;
        nuevo->total=0;
        free(fecha);
        if(!(temp=buscarProd(nuevo,1)))
        {
            agregarProd(nuevo);
            preg_error("  Producto agregado  ",0);
            ret=4;
        }
        else
        {
            preg_error("El producto ya existe\n",0);
            ret=0;
        }
        liberarResBusqP(temp);
        free(resp[3]);
        free(resp[4]);
    }
    return ret;
}

void adminProd(void)
{
    nodo_producto * listap;
    FUNC_LISTA funciones;
    char buffer1[100];
    char buffer2[160];
    char form[100];
    char *tipo2;
    char **resp;
    char *preg[]=
    {
        "Nombre","Descripcion","Codigo","Stock","Tipo busqueda","OR?",(char *)NULL
    };
    int tipo=0;
    #ifdef _WIN32
    sprintf(form," %%-4i %c %%-46.46s %c %%-45.45s %c %%-12.12s %c $%%-7i %c $%%-7i %c %%-4i",179,179,179,179,179,179);
    sprintf(buffer1," %%-4.4s %c %%-46.46s %c %%-45.45s %c %%-12.12s %c %%-8.8s %c %%-8.8s %c %%-5.5s",179,179,179,179,179,179);
    #else
    sprintf(form," %%-4i | %%-46.46s | %%-45.45s | %%-12.12s | $%%-7i | $%%-7i | %%-4i");
    sprintf(buffer1," %%-4.4s | %%-46.46s | %%-45.45s | %%-12.12s | %%-8.8s | %%-8.8s | %%-5.5s");
    #endif
    nodo_producto * filtro=(nodo_producto *) malloc(sizeof(nodo_producto));
    sprintf(buffer2,buffer1,"Num","Nombre producto","Descripcion","Codigo","Precio V","Precio C","Stock");
    funciones.print_nodo=print_product2;
    funciones.func=menuLis1;
    funciones.pnodonulo=print_nodopnulo;
    funciones.etiqueta=buffer2;
    funciones.fmtnul=buffer1;
    funciones.fmtnod=form;
    inicializarBd((nodo_usuario **)NULL,&listap); //obtengo el prod iinical
    if(!listap)
    {
        preg_error("No hay productos, agrege ahora\n   presione ESC para volver",1);
        while((tipo=addProd((nodo_producto*)NULL))!=-1); //la variable tipo es para otra cosa, aca se aprovecha no mas
        inicializarBd((nodo_usuario **)NULL,&listap); //obtengo el prod iinical
    }
    if(listap&&(tipo==-1||(resp=obtener_datos(preg,"Tipo de busqueda: 0: que contengan, stock>= / 1: que empiezen, stock<= / 2: que sea igual",45,0))))
    {
        if(tipo!=-1&&!(resp[0][0]=='\0'&&resp[1][0]=='\0'&&resp[2][0]=='\0'&&resp[3][0]=='\0'))
        {
            filtro->nombre=resp[0];
            filtro->descripcion=resp[1];
            filtro->stock=atoi(resp[3]);
            filtro->codigo=resp[2];
            tipo=atoi(resp[4]);
            tipo2=resp[5];
            if((listap=buscarProd2(filtro,tipo,*tipo2=='\0'?1:0)))
                mostrarListaP2(listap,&funciones,1);
            else preg_error("No se encontraron coincidencias",1);
            liberar_char_array(resp);
        }
        else
            mostrarListaP2(listap,&funciones,0);
    }
}

int menuLista(menuL *ml,int pos, void * dato )
{
    int x=COLS/2, nitems, largo_menu, alto_menu, ancho_menu, pos_ant = -1, pos_ac= 0;
    int tecla=ERR;
    int upd=0;
    bool salir = FALSE;
    WINDOW *wmenu;
    WINDOW * Wbody=obt_win_cuerpo();
    curs_set(0);
    dimen_smenu((menu *)ml, &nitems, &largo_menu);
    alto_menu = nitems + 2;
    ancho_menu = largo_menu + 2;
    if(pos==-1)
        pos=POS;
    POS=pos;
    wmenu = newwin(alto_menu, ancho_menu, pos, x);
    caja_color(wmenu, COLOR_SUB_MENU, 1);
    actMenuL(wmenu, ml);
    while (! salir )
    {
        if (pos_ac != pos_ant)
        {
            if (pos_ant != -1)
                mvwaddstr(wmenu, pos_ant+ 1, 1,prepad(padstr(ml[pos_ant].nombre, largo_menu - 1), 1));
            setear_color(wmenu, COLOR_SUB_MENU_SEL);
            mvwaddstr(wmenu, pos_ac + 1, 1,prepad(padstr(ml[pos_ac].nombre, largo_menu - 1), 1));
            setear_color(wmenu, COLOR_SUB_MENU);
            msg_estado(ml[pos_ac].descr);
            pos_ant = pos_ac;
            wrefresh(wmenu);
        }
        switch (tecla = wgetch(Wbody))
        {
        case '\n':
            touchwin(Wbody);
            wrefresh(Wbody);
            curs_set(1);
            upd=(ml[pos_ac].func)(dato);   //llama a la funcion del menu correspondiente
            curs_set(0);
            actMenuL(wmenu, ml);
            pos_ant = -1;
            if(upd!=-1)
                salir=1;
            break;
        case KEY_UP:
            pos_ac = (pos_ac + nitems - 1) % nitems;
            break;
        case KEY_DOWN:
            pos_ac = (pos_ac + 1) % nitems;
            break;
        case KEY_ESC:
            salir = TRUE;
            upd=-1;
            break;
        }
    }
    delwin(wmenu);
    touchwin(Wbody);
    wrefresh(Wbody);
    return upd;
}

void actMenuL(WINDOW *wmenu, menuL *mp)
{
    int i;
    menuL *p = mp;
    for (i = 0; p->func; i++, p++)
        mvwaddstr(wmenu, i + 1, 2, p->nombre);
    touchwin(wmenu);
    wrefresh(wmenu);
}

int delProd(void * lprod)
{
    nodo_producto * prod=(nodo_producto *)lprod;
    borrarProducto(prod);
    return 2;
}

int addUsr(void * lala)
{
    lala=NULL;
    char **resp;
    int s=-1;
    estad ini= {2011,0};
    nodo_usuario *usr=(nodo_usuario*)malloc(sizeof(nodo_usuario));
    res_busq_u *temp;
    char *admin[] =
    {
        "Nombre de usuario","Tipo","Password","Confirme password",(char *)0
    };
    if((resp=obtener_datos(admin,"Ingrese password del usuario, ESC para salir",40,2)))
    {
        if(strcmp(resp[2],resp[3])==0)
        {
            usr->nombre=resp[0];
            usr->id=atoi(resp[1]);
            usr->pass=resp[2];
            usr->mes_act=ini;
            usr->mes_ant=ini;
            usr->mes_ant2=ini;
            usr->dia=ini;
            usr->semana=ini;
            usr->total=0;
            usr->sig=NULL;
            if((temp=buscarUsr(usr,1)))
            {
                preg_error("El usuario ya existe",1);
                liberar_char_array(resp);
                free(usr);
            }
            else
            {
                agregarUsr(usr);
                preg_error("Usuario agregado",0);
                free(resp[1]);
                s=3; //actualiza toda la lista en pantalla
            }
            liberarResBusqU(temp);
        }
        else preg_error("Passwords no coinciden",1);
    }
    return s;
}

int delUsr(void * nodous)
{
    nodo_usuario *borrar=(nodo_usuario *) nodous;
    char c=-1;
    if(strcmp(borrar->nombre,"admin")!=0)
    {
        if((c=preg_error("Confirme presionando S(MAYUSCULA)",0)=='S'))
        {
            borrarUsuario(borrar);
            c=2;
        }
        else c=-1;
    }
    else
        preg_error("No puede borrar usuario \"admin\"",1);
    return c;
}

int editUsr(void * usuario)
{
    nodo_usuario * usr=(nodo_usuario*)usuario;
    int st;
    char *preg[]= {"Nombre","Tipo","Password",NULL};
    char **resp=(char**)calloc(3,sizeof(char*));
    nodo_usuario * filtro=(nodo_usuario *)malloc(sizeof(nodo_usuario));
    resp[0]=(char *)malloc((strlen(usr->nombre)+1)*sizeof(char));
    resp[1]=(char *)malloc(8*sizeof(char));
    resp[2]=(char *)malloc((strlen(usr->pass)+1)*sizeof(char));
    strcpy(resp[0],usr->nombre);
    itoa(usr->id,resp[1],10);
    strcpy(resp[2],usr->pass);
    if((resp=obtener_mod_datos(preg,resp,"Modifique los datos que quiera",MAXPROD,0)))
    {
        filtro->nombre=resp[0];
        filtro->pass=(char *)NULL;
        filtro->id=-1;
        if((strcmp(resp[0],usr->nombre)==0)||(filtro=buscarUsr2(filtro,2))==NULL) //si no encuentra alguno que coincide en el codigo.
        {
            free(usr->nombre);
            free(usr->pass);
            usr->nombre=resp[0];
            usr->id=atoi(resp[1]);
            usr->pass=resp[2];
        }
        else
        {
            free(resp[0]);
            free(resp[1]);
            free(resp[2]);
            preg_error("Ya existe un usuario con el mismo nombre",1);
            st=-1;
        }
        st= 1;
    }
    else
        st= -1;
    return st;
}

int editProd(void * edit)
{
    nodo_producto * prod=(nodo_producto*)edit;
    int st;
    char *preg[]= {"Nombre","Descripcion","Codigo","Precio venta","Precio compra","Stock",NULL};
    char **resp=(char**)calloc(7,sizeof(char*));
    nodo_producto * filtro=(nodo_producto *)malloc(sizeof(nodo_producto));
    resp[0]=(char *)malloc((strlen(prod->nombre)+1)*sizeof(char));
    resp[1]=(char *)malloc((strlen(prod->descripcion)+1)*sizeof(char));
    resp[2]=(char *)malloc((strlen(prod->codigo)+1)*sizeof(char));
    resp[3]=(char *)malloc(8*sizeof(char));
    resp[4]=(char *)malloc(8*sizeof(char));
    resp[5]=(char *)malloc(8*sizeof(char));
    strcpy(resp[0],prod->nombre);
    strcpy(resp[1],prod->descripcion);
    strcpy(resp[2],prod->codigo);
    itoa(prod->precio,resp[3],10);
    itoa(prod->compra,resp[4],10);
    itoa(prod->stock,resp[5],10);
    if((resp=obtener_mod_datos(preg,resp,"Modifique los datos que quiera",MAXPROD,0)))
    {
        filtro->nombre=(char *)NULL;
        filtro->descripcion=(char *)NULL;
        filtro->codigo=resp[2];
        filtro->stock=-1;
        if((strcmp(resp[2],prod->codigo)==0)||(filtro=buscarProd2(filtro,2,0))==NULL) //si no encuentra alguno que coincide en el codigo.
        {
            free(prod->nombre);
            free(prod->descripcion);
            free(prod->codigo);
            prod->nombre=resp[0];
            prod->descripcion=resp[1];
            prod->codigo=resp[2];
            prod->precio=atoi(resp[3]);
            prod->compra=atoi(resp[4]);
            prod->stock=atoi(resp[5]);
        }
        else
        {
            free(resp[0]);
            free(resp[1]);
            free(resp[2]);
            preg_error("Ya existe un producto con el mismo codigo",1);
            st=-1;
        }
        free(resp[3]);
        free(resp[4]);
        free(resp[5]);
        st= 1;
    }
    else
        st= -1;
    return st;
}

#ifdef __linux__
void itoa( int num,char * str, int base)
{
    base=0;
    sprintf(str,"%i",num);
}
#endif

void mostrarStatsP(void)
{
    menu stats[]={
    {"Mas vendidos",masTotal, "Muestra una lista ordenada por mas vendidos durante la existencia de la base de datos",0 },
    {"Mas vendidos mes actual",masmesac, "Muestra una lista ordenada por mas vendidos durante el mes actual",0 },
    {"Mas vendidos mes anterior",masmesant, "Muestra una lista ordenada por mas vendidos durante el mes anterior",0 },
    {"Mas vendidos mes anterior al anterior", masmesant2, "Muestra una lista ordenada por mas vendidos durante el mes anterior",0 },
    {"Mas vendidos semana", masSemana, "Muestra una lista ordenada por mas vendidos durante la semana",0 },
    {"Mas vendidos dia", masDia, "Muestra una lista ordenada por mas vendidos durante el dia",0 },
    { "",0, "",3 }};
    mostrar_menu(stats);
}

static void mostrarStatsU(void)
{

}

void masmesac(void)
{
    nodo_producto * inicial;
    FECHA * fecha=obtenerFecha();
    FUNC_LISTA funciones;
    char buffer1[100];
    char buffer2[160];
    char form[100];
    char res;
    #ifdef _WIN32
    sprintf(form," %%-4i %c %%-36.36s %c %%-14.14s %c %%-14i %c %%-12i %c %%-12i %c %%-12i %c %%-10i %c %%-10i",
                    179,179,179,179,179,179,179,179);
    sprintf(buffer1," %%-4.4s %c %%-36.36s %c %%-14.14s %c %%-14.14s %c %%-12.12s %c %%-12.12s %c %%-12.12s %c %%-10.10s %c %%-10.10s",
                    179,179,179,179,179,179,179,179);
    #else
    sprintf(form," %%-4i | %%-46.46s | %%-45.45s | %%-12.12s | $%%-7i | $%%-7i | %%-4i");
    sprintf(buffer1," %%-4.4s | %%-46.46s | %%-45.45s | %%-12.12s | %%-8.8s | %%-8.8s | %%-5.5s");
    #endif
    sprintf(buffer2,buffer1,"Num","Nombre producto","Codigo","Total","Mes Actual","Mes anterior","Mes ant-ant","Semana","Dia");
    funciones.print_nodo=printProdStat;
    funciones.func=NULL;
    funciones.pnodonulo=printProdNulStat;
    funciones.etiqueta=buffer2;
    funciones.fmtnul=buffer1;
    funciones.fmtnod=form;
    fecha->dia=-1;
    fecha->semana=-1;
    if((inicial=buscarProdFecha(fecha,0))!=NULL)
    {
        res=preg_error("Ascendente o Descendiente?\n   A: Ascendiente \n Otra es descendiente",0);
        if(res=='A'||res=='a')
            inicial=ordenarListaP(inicial,compProdVentMesAcAs,1);
        else inicial=ordenarListaP(inicial,compProdVentMesAcDes,1);
        mostrarListaP2(inicial,&funciones,1);
    }
    else preg_error("No hay estadisticas para este mes",0);
}

void masmesant(void)
{
    nodo_producto * inicial;
    FECHA * fecha=obtenerFecha();
    FUNC_LISTA funciones;
    char buffer1[100];
    char buffer2[160];
    char form[100];
    char res;
    #ifdef _WIN32
    sprintf(form," %%-4i %c %%-36.36s %c %%-14.14s %c %%-14i %c %%-12i %c %%-12i %c %%-12i %c %%-10i %c %%-10i",
                    179,179,179,179,179,179,179,179);
    sprintf(buffer1," %%-4.4s %c %%-36.36s %c %%-14.14s %c %%-14.14s %c %%-12.12s %c %%-12.12s %c %%-12.12s %c %%-10.10s %c %%-10.10s",
                    179,179,179,179,179,179,179,179);
    #else
    sprintf(form," %%-4i | %%-46.46s | %%-45.45s | %%-12.12s | $%%-7i | $%%-7i | %%-4i");
    sprintf(buffer1," %%-4.4s | %%-46.46s | %%-45.45s | %%-12.12s | %%-8.8s | %%-8.8s | %%-5.5s");
    #endif
    sprintf(buffer2,buffer1,"Num","Nombre producto","Codigo","Total","Mes Actual","Mes anterior","Mes ant-ant","Semana","Dia");
    funciones.print_nodo=printProdStat;
    funciones.func=NULL;
    funciones.pnodonulo=printProdNulStat;
    funciones.etiqueta=buffer2;
    funciones.fmtnul=buffer1;
    funciones.fmtnod=form;
    fecha->dia=-1;
    fecha->semana=-1;
    if((inicial=buscarProdFecha(fecha,1))!=NULL)
    {
        res=preg_error("Ascendente o Descendiente?\n   A: Ascendiente \n Otra es descendiente",0);
        if(res=='A'||res=='a')
            inicial=ordenarListaP(inicial,compProdVentMesAntAs,1);
        else inicial=ordenarListaP(inicial,compProdVentMesAntDes,1);
        mostrarListaP2(inicial,&funciones,1);
    }
    else preg_error("No hay estadisticas para este mes",0);
}

void masmesant2(void)
{
    nodo_producto * inicial;
    FECHA * fecha=obtenerFecha();
    FUNC_LISTA funciones;
    char buffer1[100];
    char buffer2[160];
    char form[100];
    char res;
    #ifdef _WIN32
    sprintf(form," %%-4i %c %%-36.36s %c %%-14.14s %c %%-14i %c %%-12i %c %%-12i %c %%-12i %c %%-10i %c %%-10i",
                    179,179,179,179,179,179,179,179);
    sprintf(buffer1," %%-4.4s %c %%-36.36s %c %%-14.14s %c %%-14.14s %c %%-12.12s %c %%-12.12s %c %%-12.12s %c %%-10.10s %c %%-10.10s",
                    179,179,179,179,179,179,179,179);
    #else
    sprintf(form," %%-4i | %%-46.46s | %%-45.45s | %%-12.12s | $%%-7i | $%%-7i | %%-4i");
    sprintf(buffer1," %%-4.4s | %%-46.46s | %%-45.45s | %%-12.12s | %%-8.8s | %%-8.8s | %%-5.5s");
    #endif
    sprintf(buffer2,buffer1,"Num","Nombre producto","Codigo","Total","Mes Actual","Mes anterior","Mes ant-ant","Semana","Dia");
    funciones.print_nodo=printProdStat;
    funciones.func=NULL;
    funciones.pnodonulo=printProdNulStat;
    funciones.etiqueta=buffer2;
    funciones.fmtnul=buffer1;
    funciones.fmtnod=form;
    fecha->dia=-1;
    fecha->semana=-1;
    if((inicial=buscarProdFecha(fecha,2))!=NULL)
    {
        res=preg_error("Ascendente o Descendiente?\n   A: Ascendiente \n Otra es descendiente",0);
        if(res=='A'||res=='a')
            inicial=ordenarListaP(inicial,compProdVentMesAnt2As,1);
        else inicial=ordenarListaP(inicial,compProdVentMesAnt2Des,1);
        mostrarListaP2(inicial,&funciones,1);
    }
    else preg_error("No hay estadisticas para este mes",0);
    //ordenarListaP();
}

void masTotal(void)
{
    FUNC_LISTA funciones;
    char buffer1[100];
    char buffer2[160];
    char form[100];
    char res;
    #ifdef _WIN32
    sprintf(form," %%-4i %c %%-36.36s %c %%-14.14s %c %%-14i %c %%-12i %c %%-12i %c %%-12i %c %%-10i %c %%-10i",
                    179,179,179,179,179,179,179,179);
    sprintf(buffer1," %%-4.4s %c %%-36.36s %c %%-14.14s %c %%-14.14s %c %%-12.12s %c %%-12.12s %c %%-12.12s %c %%-10.10s %c %%-10.10s",
                    179,179,179,179,179,179,179,179);
    #else
    sprintf(form," %%-4i | %%-46.46s | %%-45.45s | %%-12.12s | $%%-7i | $%%-7i | %%-4i");
    sprintf(buffer1," %%-4.4s | %%-46.46s | %%-45.45s | %%-12.12s | %%-8.8s | %%-8.8s | %%-5.5s");
    #endif
    sprintf(buffer2,buffer1,"Num","Nombre producto","Codigo","Total","Mes Actual","Mes anterior","Mes ant-ant","Semana","Dia");
    funciones.print_nodo=printProdStat;
    funciones.func=NULL;
    funciones.pnodonulo=printProdNulStat;
    funciones.etiqueta=buffer2;
    funciones.fmtnul=buffer1;
    funciones.fmtnod=form;
    nodo_producto *inicial;
    inicializarBd(NULL,&inicial);
    res=preg_error("Ascendente o Descendiente?\n   A: Ascendiente \n Otra es descendiente",0);
    if(res=='A'||res=='a')
        mostrarListaP2(ordenarListaP(NULL,compProdVentTotalAs,1),&funciones,1);
    else mostrarListaP2(ordenarListaP(NULL,compProdVentTotalDes,1),&funciones,1);
}

void masDia(void)
{
    nodo_producto * inicial;
    FECHA * fecha=obtenerFecha();
    FUNC_LISTA funciones;
    char buffer1[100];
    char buffer2[160];
    char form[100];
    char res;
    #ifdef _WIN32
    sprintf(form," %%-4i %c %%-36.36s %c %%-14.14s %c %%-14i %c %%-12i %c %%-12i %c %%-12i %c %%-10i %c %%-10i",
                    179,179,179,179,179,179,179,179);
    sprintf(buffer1," %%-4.4s %c %%-36.36s %c %%-14.14s %c %%-14.14s %c %%-12.12s %c %%-12.12s %c %%-12.12s %c %%-10.10s %c %%-10.10s",
                    179,179,179,179,179,179,179,179);
    #else
    sprintf(form," %%-4i | %%-46.46s | %%-45.45s | %%-12.12s | $%%-7i | $%%-7i | %%-4i");
    sprintf(buffer1," %%-4.4s | %%-46.46s | %%-45.45s | %%-12.12s | %%-8.8s | %%-8.8s | %%-5.5s");
    #endif
    sprintf(buffer2,buffer1,"Num","Nombre producto","Codigo","Total","Mes Actual","Mes anterior","Mes ant-ant","Semana","Dia");
    funciones.print_nodo=printProdStat;
    funciones.func=NULL;
    funciones.pnodonulo=printProdNulStat;
    funciones.etiqueta=buffer2;
    funciones.fmtnul=buffer1;
    funciones.fmtnod=form;
    if((inicial=buscarProdFecha(fecha,0))!=NULL)
    {
        res=preg_error("Ascendente o Descendiente?\n   A: Ascendiente \n Otra es descendiente",0);
        if(res=='A'||res=='a')
            inicial=ordenarListaP(inicial,compProdVentDiaAs,1);
        else inicial=ordenarListaP(inicial,compProdVentDiaDes,1);
        mostrarListaP2(inicial,&funciones,1);
    }
    else preg_error("No hay estadisticas para este mes",0);
    //ordenarListaP();
}

void masSemana(void)
{
    nodo_producto * inicial;
    FECHA * fecha=obtenerFecha();
    FUNC_LISTA funciones;
    char buffer1[100];
    char buffer2[160];
    char form[100];
    char res;
    #ifdef _WIN32
    sprintf(form," %%-4i %c %%-36.36s %c %%-14.14s %c %%-14i %c %%-12i %c %%-12i %c %%-12i %c %%-10i %c %%-10i",
                    179,179,179,179,179,179,179,179);
    sprintf(buffer1," %%-4.4s %c %%-36.36s %c %%-14.14s %c %%-14.14s %c %%-12.12s %c %%-12.12s %c %%-12.12s %c %%-10.10s %c %%-10.10s",
                    179,179,179,179,179,179,179,179);
    #else
    sprintf(form," %%-4i | %%-46.46s | %%-45.45s | %%-12.12s | $%%-7i | $%%-7i | %%-4i");
    sprintf(buffer1," %%-4.4s | %%-46.46s | %%-45.45s | %%-12.12s | %%-8.8s | %%-8.8s | %%-5.5s");
    #endif
    sprintf(buffer2,buffer1,"Num","Nombre producto","Codigo","Total","Mes Actual","Mes anterior","Mes ant-ant","Semana","Dia");
    funciones.print_nodo=printProdStat;
    funciones.func=NULL;
    funciones.pnodonulo=printProdNulStat;
    funciones.etiqueta=buffer2;
    funciones.fmtnul=buffer1;
    funciones.fmtnod=form;
    fecha->dia=-1;
    if((inicial=buscarProdFecha(fecha,0))!=NULL)
    {
        res=preg_error("Ascendente o Descendiente?\n   A: Ascendiente \n Otra es descendiente",0);
        if(res=='A'||res=='a')
            inicial=ordenarListaP(inicial,compProdVentSemanaAs,1);
        else inicial=ordenarListaP(inicial,compProdVentSemanaDes,1);
        mostrarListaP2(inicial,&funciones,1);
    }
    else preg_error("No hay estadisticas para este mes",0);
}
